package edu.amm.fanal.api;

import edu.amm.algorithms.Simpson;
import edu.amm.api.Bounds;

/**
 * Пространство Лебега L2.
 * 
 * @author Иванов Илья
 * @since 2013-05-12
 *
 */
public class LebesgueSpace extends FunctionalSpace {
	
	/**
	 * Создаёт функциональное пространство на заданном отрезке.
	 * 
	 * @param bounds Границы отрезка.
	 */
	public LebesgueSpace(Bounds bounds) {
		super(bounds);
	}
	
	/**
	 * @param first Первый аргумент скалярного произведения.
	 * @param second Второй аргумент скалярного произведения.
	 * @return Значение скалярного произведения аргументов.
	 */
	public double scalarProduct(final Function first, final Function second) {
		if (first == null || second == null)
			throw new RuntimeException("Не задан один из аргументов скалярного произведения");
		
		Function multiplication = new Function(first.getDim()) {
			
			protected double getValue(double... x) {
				return first.evaluate(x) * second.evaluate(x);
			}
		};
		
		return Simpson.integrate(multiplication, getLeftBound(), getRightBound(), SIMPSON_HALF_SEGMENTS_COUNT);
	}
	
	public String getSpaceName() {
		return String.format("Пространство L2 на отрезке [%f, %f]", getLeftBound(), getRightBound());
	}
	
	protected double getNorm(Function elem) {
		return scalarProduct(elem, elem);
	}
	
	private final int SIMPSON_HALF_SEGMENTS_COUNT = 500;
}